package ru.spb.nicetu.altx.mnemo.math.managers;

import java.util.Collection;
import java.util.Comparator;
import java.util.TreeSet;

import ru.spb.nicetu.altx.mnemo.node.INode;
import ru.spb.nicetu.altx.mnemo.node.LoadTaskNode;
import ru.spb.nicetu.altx.mnemo.node.StoreTaskNode;
import ru.spb.nicetu.altx.mnemo.node.factory.INodeFactory;
import ru.spb.nicetu.altx.mnemo.node.factory.TaskNodeFactory;
import ru.spb.nicetu.altx.mnemo.node.factory.TaskNodeFactory.TaskTypes;

public class NodeFactoryManager {
  protected NodeFactoryManager() {
  }

  private static NodeFactoryManager instance = new NodeFactoryManager();

  public static NodeFactoryManager getInstance() {
    return instance;
  }

  /**
   * Проверка, что factory - это фабрика, порождающая TaskNode-ы, которые
   * "взаимодействуют с БД".
   */
  public static boolean isDBTaskNodeFactory(INodeFactory factory) {
    boolean result = false;
    if (factory instanceof TaskNodeFactory) {
      TaskNodeFactory taskNodeFactory = (TaskNodeFactory) factory;
      TaskTypes taskType = taskNodeFactory.getTaskType();
      result = TaskTypes.LOAD.equals(taskType) ||
          TaskTypes.STORE.equals(taskType);
    }
    return result;
  }

  /**
   * Проверка, что node - TaskNode, который "взаимодействует с БД".
   */
  public static boolean isDBTaskNode(INode node) {
    return (node instanceof LoadTaskNode) || (node instanceof StoreTaskNode);
  }

  private Collection<INodeFactory> nodeFactories = new TreeSet<INodeFactory>(
      new Comparator<INodeFactory>() {
        
        public int compare(INodeFactory o1, INodeFactory o2) {
          return o1.getName().compareToIgnoreCase(o2.getName());
        }
      });

  // = new ArrayList<INodeFactory>();

  public void addNodeFactory(INodeFactory factory) {
    nodeFactories.add(factory);
  }

  public INodeFactory[] getAllNodeFactories() {
    return nodeFactories.toArray(new INodeFactory[0]);
  }

}
